﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyNganHangDe.DAL;
using QuanLyNganHangDe.DAL.Models;
using QuanLyNganHangDe.GUI;

/**
 * HISTORY
 * 
 * 20140605-0510
 * # Sắp xếp theo thứ tự ABC của tên câu hỏi?
 */
namespace QuanLyNganHangDe.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ liên quan đến câu hỏi
    /// </summary>
    partial class BizCauHoi
    {
        public static List<Khoi> GetListKhoiByHocPhan(string maHocPhan)
        {
            using (var db = new QLNHD_KHContext())
            {
                var kh = db.KhoiDbSet.Where(e => e.MaHocPhan == maHocPhan).OrderBy(e => e.TenKhoi).ToList();
                return kh;
            }
        }
        public static List<Khoi> GetListKhoi(string maCauHoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var ch = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (ch != null)
                {
                    var hp = db.HocPhanDbSet.Where(e => e.MaHocPhan == ch.Khoi.HocPhan.MaHocPhan).SingleOrDefault();
                    if (hp != null)
                        if (hp.KhoiCollection != null && hp.KhoiCollection.Count > 0)
                            return hp.KhoiCollection.ToList();
                        else
                            return null;
                    else
                        throw new Exception("Không tồn tại học phần chứa câu hỏi này");
                }
                else
                    throw new Exception("Câu hỏi này không tồn tại");

            }
        }

        //public static List<GridCauHoiForQuanLy> GeneralQuestion()
        //{
        //    List<Khoi> dskhoi = new List<Khoi>();
        //    for (int i = 0; i < 5; i++)
        //    {
        //        Khoi khoi = new Khoi() { MaKhoi = i.ToString(), TenKhoi = "Khối " + i.ToString(), SoDiem = "2" };
        //        dskhoi.Add(khoi);
        //    }
        //    List<GridCauHoiForQuanLy> rs = new List<GridCauHoiForQuanLy>();
        //    int ma = 0;
        //    for (int i = 0; i < 5; i++)
        //        for (int j = 0; j < 5; j++)
        //        {
        //            ma++;
        //            GridCauHoiForQuanLy ch = new GridCauHoiForQuanLy() { MaCauHoi = i.ToString(), TenCauHoi = i.ToString() + j.ToString(), TenKhoi = dskhoi[i].TenKhoi, Diem = dskhoi[i].SoDiem, NoiDung = "Nội dung " + i.ToString() + j.ToString() };
        //            rs.Add(ch);
        //        }
        //    return rs;
        //}

        internal static string AddDSCauHoi(List<CauHoi> dsCauHoi, HocPhan hocPhan)
        {
            try
            {
                using (var context = QLNHD_KHContext.GetContext())
                {
                    foreach (var item in dsCauHoi)
                    {
                        var tenKhoi = item.Khoi.TenKhoi.Replace("\r", "").Replace("\n", "");
                        Khoi khoi = null;
                        var khoils = (from e in context.KhoiDbSet
                                      where
                                      e.MaHocPhan == hocPhan.MaHocPhan
                                      select e).ToList();
                        int i = 0;
                        for (i = 0; i < khoils.Count; i++)
                        {
                            if (khoils[i].TenKhoi.ToLower().Equals(tenKhoi.ToLower()))
                            {
                                khoi = khoils[i];
                                break;
                            }
                        }
                        if (khoils == null || khoils.Count == 0 || i == khoils.Count)
                            khoi = context.KhoiDbSet.Add(new Khoi { MaKhoi = Guid.NewGuid().ToString(), TenKhoi = tenKhoi, MaHocPhan = hocPhan.MaHocPhan, SoDiem = item.Khoi.SoDiem });
                        //khoi = new Khoi { MaKhoi = Guid.NewGuid().ToString(), TenKhoi = item.Khoi.TenKhoi, MaHocPhan = hocPhan.MaHocPhan, SoDiem = item.Khoi.SoDiem };
                        //item.MaCauHoi = Guid.NewGuid().ToString();
                        //item.MaKhoi = khoi.MaKhoi;
                        //item.NguoiSuDung = Program.NguoiSuDung;
                        CauHoi ch = new CauHoi
                        {
                            MaCauHoi = Guid.NewGuid().ToString(),
                            TenCauHoi = item.TenCauHoi,
                            NoiDungCauHoi_RTF = item.NoiDungCauHoi_RTF,
                            NoiDungCauHoi_Unicode = Trim250(item.NoiDungCauHoi_Unicode),
                            NoiDungTraLoi_RTF = item.NoiDungTraLoi_RTF,
                            NoiDungTraLoi_Unicode = Trim250(item.NoiDungTraLoi_Unicode),
                            MaKhoi = khoi.MaKhoi,
                            TenDangNhap = Program.NguoiSuDung == null ? "admin" : Program.NguoiSuDung.TenDangNhap,
                            ConSuDung = true
                        };
                        context.CauHoiDbSet.Add(ch);
                        context.SaveChanges();
                    }

                    return dsCauHoi.Count.ToString();
                }
            }
            catch(Exception ex)
            {
                return ex.ToString();
            }
        }

        internal static bool AddCauHoi(CauHoi cauHoi)
        {
            try
            {
                using (var context = QLNHD_KHContext.GetContext())
                {
                    cauHoi.MaCauHoi = Guid.NewGuid().ToString();
                    cauHoi.TenDangNhap = Program.NguoiSuDung == null ? "admin" : Program.NguoiSuDung.TenDangNhap;
                    cauHoi.ConSuDung = true;
                    context.CauHoiDbSet.Add(cauHoi);
                    context.SaveChanges();
                    return true;
                }
            }
            catch
            {
                throw new Exception("Không thể thêm câu hỏi vào CSDL");
            }
        }

        static string Trim250(string str)
        {
            if (string.IsNullOrEmpty(str))
                return "";
            else if (str.Length <= 250)
                return str;
            else
                return str.Substring(0, 247) + "...";
        }

        internal static int UpdateContent(string maCauHoi, string noiDung_RTF, string dapAn_RTF, string noiDung_Unicode, string dapAn_Unicode)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.NoiDungCauHoi_RTF = noiDung_RTF;
                        cauHoi.NoiDungCauHoi_Unicode = Trim250(noiDung_Unicode);
                        cauHoi.NoiDungTraLoi_RTF = dapAn_RTF;
                        cauHoi.NoiDungTraLoi_Unicode = Trim250(dapAn_Unicode);
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        internal static int UpdateTitle(string maCauHoi, string tenCauHoi, string diem, string tenKhoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.TenCauHoi = tenCauHoi;
                        cauHoi.Khoi.TenKhoi = tenKhoi;
                        cauHoi.Khoi.SoDiem = diem;
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        internal static int UpdateKhoi(string maCauHoi, string maKhoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.MaKhoi = maKhoi;
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }


        internal static List<GridCauHoiForQuanLy> GetListCauHoi(HocPhan hocPhan, int vaitro)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                if (hocPhan == null)
                    return null;
                var maHocPhan = hocPhan.MaHocPhan;
                List<GridCauHoiForQuanLy> lst = null;
                if (vaitro == (int)QuanLyNganHangDe.DAL.Models.NguoiSuDung.VAITRO.QuanTriHeThong)
                {
                    var lstCauHoi = context.CauHoiDbSet.Where(e => e.Khoi.HocPhan.MaHocPhan == maHocPhan).ToList();
                    lst = new List<GridCauHoiForQuanLy>();
                    foreach (var x in lstCauHoi)
                        lst.Add(new GridCauHoiForQuanLy(x));
                }
                else
                {
                    var lstCauHoi = context.CauHoiDbSet.Where(e => e.Khoi.HocPhan.MaHocPhan == maHocPhan && e.ConSuDung).ToList();
                    lst = new List<GridCauHoiForQuanLy>();
                    foreach (var x in lstCauHoi)
                        lst.Add(new GridCauHoiForQuanLy(x));
                }
                lst.Sort();
                return lst;
            }
        }

        internal static int XoaCauHoi(string maCauHoi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var ch = (from e in context.CauHoiDbSet
                          where e.MaCauHoi == maCauHoi
                          select e).FirstOrDefault();
                if (ch != null)
                {
                    var maKhoi = ch.MaKhoi;
                    if (ch.ConSuDung)
                    {
                        ch.ConSuDung = false;
                        context.SaveChanges();
                    }
                    else
                    {
                        if (ch.DeInRaCollection != null && ch.DeInRaCollection.Count > 0)
                        {
                            context.CauHoiDbSet.Remove(ch);
                            context.SaveChanges();
                        }
                    }
                    var phan = (from e in context.KhoiDbSet
                                where e.MaKhoi == maKhoi
                                select e).SingleOrDefault();
                    if (phan != null && phan.CauHoiCollection.Count == 0)
                    {
                        context.KhoiDbSet.Remove(phan);
                        context.SaveChanges();
                    }
                    return 1;
                }
                else
                    return 0;
            }
        }

        /// <summary>
        /// Phục hồi lại những câu hỏi đã đánh dấu xóa
        /// </summary>
        /// <param name="maCauHoi"></param>
        /// <returns></returns>
        internal static bool PhucHoi(string maCauHoi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var ch = (from e in context.CauHoiDbSet
                          where e.MaCauHoi == maCauHoi
                          select e).FirstOrDefault();
                if (ch != null)
                {
                    ch.ConSuDung = true;
                    context.SaveChanges();
                    return true;
                }
                else
                    throw new Exception("Câu hỏi này không tồn tại");
            }
        }
    }
    public class GridCauHoiForQuanLy : IComparable<GridCauHoiForQuanLy>
    {
        public GridCauHoiForQuanLy(CauHoi e)
        {
            Diem = e.Khoi.SoDiem;
            MaCauHoi = e.MaCauHoi;
            NoiDung = e.NoiDungCauHoi_Unicode; TenCauHoi = e.TenCauHoi;
            TenKhoi = e.Khoi.TenKhoi;
            SoLanDaDung = e.DeInRaCollection.Count;
            ConSuDung = e.ConSuDung;
            NoiDung_RTF = e.NoiDungCauHoi_RTF;
            DapAn_RTF = e.NoiDungTraLoi_RTF;
            SttKhoi = e.Khoi.Stt;
            AssignSoThuThu();
        }

        public GridCauHoiForQuanLy()
        {
        }

        public string MaCauHoi { get; set; }
        public string TenCauHoi { get; set; }
        public string NoiDung { get; set; }
        public string NoiDung_RTF { get; set; }
        public string DapAn_RTF { get; set; }
        public string TenKhoi { get; set; }
        public string Diem { get; set; }
        public int SoLanDaDung { get; set; }
        public string SoLanDaDungStr { get { return ConSuDung ? SoLanDaDung.ToString() : "Không còn sử dụng"; } }
        public bool ConSuDung { get; set; }
        public int SttKhoi { get; set; }
        public bool IsSeclected { get; set; }
        public int SoThuTuI { get; set; }
        public int SoThuTuII { get; set; }

        private void AssignSoThuThu()
        {
            var st = this.TenCauHoi;
            if (string.IsNullOrEmpty(st) == false)
            {
                st = st.Trim().Substring(4);
                while (true)
                {
                    if ("01234567890".Contains(st[st.Length - 1]) == false)
                        st = st.Remove(st.Length - 1);
                    else
                        break;
                }
                var info = st.Split('.');
                if (info.Length == 2)
                {
                    SoThuTuI = Convert.ToInt32(info[0].Trim());
                    SoThuTuII = Convert.ToInt32(info[1].Trim());
                }
                else if (info.Length == 1)
                {
                    SoThuTuI = Convert.ToInt32(info[0].Trim());
                    SoThuTuII = 0;
                }
            }
        }

        public int CompareTo(GridCauHoiForQuanLy other)
        {
            if (SttKhoi < other.SttKhoi)
                return -1;
            else if (SttKhoi > other.SttKhoi)
                return 1;
            else
            {
                if (SoThuTuI < other.SoThuTuI)
                    return -1;
                else if (SoThuTuI > other.SoThuTuI)
                    return 1;
                else
                {
                    if (SoThuTuII < other.SoThuTuII)
                        return -1;
                    else if (SoThuTuII > other.SoThuTuII)
                        return 1;
                    else
                        return 0;
                }
            }
        }
    }
}
